home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 39
/
Amiga Format CD39 (1999-04-13)(Future Publishing)(GB)[!][issue 1999-05].iso
/
-seriously_amiga-
/
graphics
/
ripley
/
source
/
yuvconversion.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-03-02
|
3KB
|
162 lines
#include "yuvconversion.h"
#include <exec/types.h>
static unsigned short cliptab[256*3];
static unsigned short *clipp;
void inityuv2rgb(void)
{
int i;
unsigned short *cp = cliptab;
clipp = &cliptab[256];
for (i = -256; i < 512; ++i)
{
*cp++ = i < 0 ? 0 : (i > 255 ? 255 : i);
}
}
void yuv2rgb(unsigned char **srcbuffer, ULONG *rgbp, int w, int h, int br)
{
int x, y;
unsigned char *py1, *py2, *pu, *pv;
int t0, t1, t2, t3;
int u, v, vt0, ut1, utx;
ULONG *rgbp1, *rgbp2;
rgbp1 = rgbp;
rgbp2 = rgbp + w;
py1 = srcbuffer[0];
pu = srcbuffer[1];
pv = srcbuffer[2];
py2 = py1 + w;
br -= 16;
for (y = 0; y < h/2; ++y)
{
for (x = 0; x < w/2; ++x)
{
t0 = (*py1++ + br) * 298;
t1 = (*py1++ + br) * 298;
t2 = (*py2++ + br) * 298;
t3 = (*py2++ + br) * 298;
u = *pu++ - 128;
v = *pv++ - 128;
vt0 = v * 409;
ut1 = u * 516;
utx = u * -100 + v * -208;
*rgbp1++ = (clipp[(t0 + vt0) >> 8] << 16) +
(clipp[(t0 + utx) >> 8] << 8) +
clipp[(t0 + ut1) >> 8];
*rgbp1++ = (clipp[(t1 + vt0) >> 8] << 16) +
(clipp[(t1 + utx) >> 8] << 8) +
clipp[(t1 + ut1) >> 8];
*rgbp2++ = (clipp[(t2 + vt0) >> 8] << 16) +
(clipp[(t2 + utx) >> 8] << 8) +
clipp[(t2 + ut1) >> 8];
*rgbp2++ = (clipp[(t3 + vt0) >> 8] << 16) +
(clipp[(t3 + utx) >> 8] << 8) +
clipp[(t3 + ut1) >> 8];
}
py1 += w;
py2 += w;
rgbp1 += w;
rgbp2 += w;
}
}
#ifndef __PPC__
void yuv2rgbgrey(unsigned char **srcbuffer, ULONG *rgbp, int w, int h, int br)
{
int i;
unsigned char *source;
unsigned char *dest;
unsigned char p;
source = srcbuffer[0];
dest = (char *) rgbp;
for (i=0; i < w*h; ++i)
{
p = clipp[*source++ + br];
*dest++= 0;
*dest++= p;
*dest++= p;
*dest++= p;
}
}
void yuv2pip(unsigned char *address ,unsigned char **srcbuffer, int x, int y, int br)
{
unsigned char *py, *pu, *pv, *puu, *pvv;
int i,yy,xx;
py = srcbuffer[0];
pu = srcbuffer[1];
pv = srcbuffer[2];
y = y++;
x = x++;
for (yy = 0; yy < y+1; yy++)
{
for (i = 0; i < 2; i++)
{
puu = pu;
pvv = pv;
for(xx = 0; xx < x+1; xx++)
{
*address++ = *py++;
*address++ = *puu++;
*address++ = *py++;
*address++ = *pvv++;
}
}
pu = puu;
pv = pvv;
}
}
void yuv2pipgrey(unsigned char *address,unsigned char **scrbuffer, int y, int br)
{
unsigned char *py = scrbuffer[0];
int yy;
for (yy = 0; yy < y; yy++)
{
*address++ = *py++;
*address++ = 128;
*address++ = *py++;
*address++ = 128;
}
}
#endif